home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1993-08-16 | 6.9 KB | 261 lines |
-
- IMPLEMENTATION MODULE QuadDrucke;
-
- FROM InOut IMPORT Echo, Read, ReadCard, WriteCard, WriteLn, Write, WriteString;
- FROM QuadLese IMPORT QuadZeile, MaxZeile, MaxBefehle, arrList, arrQuad;
-
- PROCEDURE DruckeLeerzeichen(Zaehler : CARDINAL);
- BEGIN
- WHILE Zaehler # 0 DO
- WriteString(" ");
- DEC(Zaehler);
- END;
- END DruckeLeerzeichen;
-
-
- PROCEDURE DruckeQuadrupel(Zeile : QuadZeile);
- VAR i : CARDINAL;
- BEGIN
- Write("(");
- WriteCard(Zeile.Zeile,2);
- Write(";");
- FOR i:=1 TO MaxZeile DO
- IF (Zeile.Befehl[i] >= " ") AND (Zeile.Befehl[i] <= "z") THEN
- Write(Zeile.Befehl[i]);
- ELSE
- Write(" ");
- END;
- END;
- Write(";");
- WriteCard(Zeile.IFzeile,2);
- Write(";");
- WriteCard(Zeile.ELSEzeile,2);
- Write(")");
- END DruckeQuadrupel;
-
-
- PROCEDURE DruckeZuweisung(BefehlsListe : arrList;
- Zeiger : CARDINAL) : CARDINAL;
- BEGIN
- Write("X");
- INC(Zeiger);
-
- WHILE BefehlsListe[Zeiger] # ":" DO
- Write(BefehlsListe[Zeiger]);
- INC(Zeiger);
- END;
-
- WriteString(":=");
- INC(Zeiger);
-
- IF BefehlsListe[Zeiger] = "X" THEN
- Write("X");
- INC(Zeiger);
- WHILE ((BefehlsListe[Zeiger] >= "0") AND (BefehlsListe[Zeiger] <= "9")) DO
- Write(BefehlsListe[Zeiger]);
- INC(Zeiger);
- END;
- ELSE
- IF (BefehlsListe[Zeiger] >= "0") AND (BefehlsListe[Zeiger] <= "9") THEN
- WHILE ((BefehlsListe[Zeiger] >= "0") AND (BefehlsListe[Zeiger] <= "9")) DO
- Write(BefehlsListe[Zeiger]);
- INC(Zeiger);
- END;
- ELSE
- IF BefehlsListe[Zeiger] = "p" THEN
- WriteString("pred");
- INC(Zeiger);
- WHILE BefehlsListe[Zeiger] # ")" DO
- Write(BefehlsListe[Zeiger]);
- INC(Zeiger);
- END;
- Write(")");
- INC(Zeiger);
- ELSE
- WriteString("succ");
- INC(Zeiger);
- WHILE BefehlsListe[Zeiger] # ")" DO
- Write(BefehlsListe[Zeiger]);
- INC(Zeiger);
- END;
- Write(")");
- INC(Zeiger);
- END
- END;
- END;
- IF BefehlsListe[Zeiger] = ";" THEN
- Write(";");
- INC(Zeiger);
- END;
- WriteLn;
- RETURN Zeiger;
- END DruckeZuweisung;
-
-
- PROCEDURE DruckeSchleife(BefehlsListe : arrList;
- Zeiger : CARDINAL ) : CARDINAL;
- BEGIN
- WriteString("while ");
- INC(Zeiger);
- WHILE BefehlsListe[Zeiger] # "#" DO
- Write(BefehlsListe[Zeiger]);
- INC(Zeiger);
- END;
- WriteString(" # ");
- INC(Zeiger);
- WHILE BefehlsListe[Zeiger] # "d" DO
- Write(BefehlsListe[Zeiger]);
- INC(Zeiger);
- END;
- WriteString(" do");
- WriteLn;
- INC(Zeiger);
- RETURN Zeiger;
- END DruckeSchleife;
-
-
- PROCEDURE DruckeUnterprogramm(BefehlsListe : arrList;
- Zeiger : CARDINAL) : CARDINAL;
- BEGIN
- Write("U");
- INC(Zeiger);
-
- WHILE ((BefehlsListe[Zeiger] >= "0") AND (BefehlsListe[Zeiger] <= "9")) DO
- Write(BefehlsListe[Zeiger]);
- INC(Zeiger);
- END;
-
- IF BefehlsListe[Zeiger] = ";" THEN
- Write(";");
- INC(Zeiger);
- END;
-
- WriteLn;
- RETURN Zeiger;
- END DruckeUnterprogramm;
-
-
- PROCEDURE Drucke(BefehlsListe : arrList; QuadListe : arrQuad);
- CONST Anzahl = 2;
- VAR Leerzeichen, i,
- While, (* Zaehler fuer noch offene 'while' Anweisungen. *)
- Zaehler, (* Zaehler fuer Quadrupel-Zeilen. *)
- Begin, (* Zaehler fuer noch offene 'begin' Anweisungen. *)
- Zeiger : CARDINAL; (* Zeigt auf den zu druckenden Befehl. *)
- Fehler : BOOLEAN; (* Wird benoetigt um die *)
- (* verschachtelten IF-Anweisungen zu *)
- (* vermeiden. *)
- WhileBegin : ARRAY [1..MaxBefehle] OF BOOLEAN;
- (* Falls ein while-begin Konstrukt aufgetreten *)
- (* ist, wird dies hier vermerkt. *)
- BEGIN
- WriteLn;WriteLn;
- FOR i:=1 TO MaxBefehle DO
- WhileBegin[i]:=FALSE;
- END;
- Leerzeichen:=1;
- While:=0;
- Zaehler:=1;
- Begin:=0;
- Zeiger:=1;
-
- REPEAT
- Fehler:=TRUE;
-
-
- IF (BefehlsListe[Zeiger] = "b") OR (BefehlsListe[Zeiger] = "e") THEN
- DruckeLeerzeichen(11+MaxZeile); (* 3 Semikolons *)
- (* 2 Klammern *)
- (* 3 * 2 fuer Zeilennummern = 11 *)
- (* + MaxZeile *)
- ELSE
- DruckeQuadrupel(QuadListe[Zaehler]);
- INC(Zaehler);
- END;
-
- IF (BefehlsListe[Zeiger] = "b") AND Fehler THEN (* begin *)
- INC(Begin);
- DruckeLeerzeichen(Anzahl*Leerzeichen);
- WriteString("begin");WriteLn;
- INC(Leerzeichen);
- INC(Zeiger);
- Fehler:=FALSE;
- END;
-
- IF (BefehlsListe[Zeiger] = "e") AND Fehler THEN (* end *)
- DEC(Begin);
- DEC(Leerzeichen);
- DruckeLeerzeichen(Anzahl*Leerzeichen);
- WriteString("end");
- INC(Zeiger);
- IF BefehlsListe[Zeiger] = ";" THEN
- Write(";");
- INC(Zeiger);
- END;
- WriteLn;
- Fehler:=FALSE;
-
- IF While # 0 THEN (* Gehoert diese end-Anweisung zu einem *)
- (* while-begin Konstrukt ??? *)
- WhileBegin[While]:=FALSE;
- WHILE NOT(WhileBegin[While]) AND (While >= 1) DO
- DEC(Leerzeichen);
- DEC(While);
- END;
- END;
- END;
-
- IF (BefehlsListe[Zeiger] = "X") AND Fehler THEN (* Zuweisung *)
- DruckeLeerzeichen(Anzahl*Leerzeichen);
- Zeiger:=DruckeZuweisung(BefehlsListe,Zeiger);
- Fehler:=FALSE;
- END;
-
- IF (BefehlsListe[Zeiger] = "U") AND Fehler THEN (* Unterprogramm *)
- DruckeLeerzeichen(Anzahl*Leerzeichen);
- Zeiger:=DruckeUnterprogramm(BefehlsListe,Zeiger);
- Fehler:=FALSE;
- END;
-
-
-
- IF (BefehlsListe[Zeiger] = "w") AND Fehler THEN (* while *)
- DruckeLeerzeichen(Anzahl*Leerzeichen);
- Zeiger:=DruckeSchleife(BefehlsListe,Zeiger);
-
- IF BefehlsListe[Zeiger] = "X" THEN (* while-X:=X Konstrukt *)
- DruckeQuadrupel(QuadListe[Zaehler]);
- INC(Zaehler);
- DruckeLeerzeichen(Anzahl*(Leerzeichen+1));
- Zeiger:=DruckeZuweisung(BefehlsListe,Zeiger);
-
- IF While # 0 THEN
- WHILE NOT(WhileBegin[While]) AND (While >=1) DO
- DEC(Leerzeichen);
- DEC(While);
- END;
- END;
- ELSE
- IF BefehlsListe[Zeiger] = "w" THEN
- INC(While);
- INC(Leerzeichen);
- ELSE (* while-begin Konstrukt *)
- INC(While);
- INC(Leerzeichen);
- WhileBegin[While]:=TRUE;
- END;
- END;
- Fehler:=FALSE;
- END;
-
- IF Fehler THEN
- WriteLn;
- WriteString("Dies ist kein while-Programm!!!");WriteLn;
- HALT;
- END;
-
- UNTIL Begin = 0;
- END Drucke;
-
- END QuadDrucke.
-